// console.log('准备工作')
// for (let i = 0; i < 3; i++) {
//   for (let i = 0; i < 3; i++) {
//     console.log(i)
//   }
//   console.log('let内层结束')
// }

// // 0
// // 1
// // 2
// // let内层结束
// // 0
// // 1
// // 2
// // let内层结束
// // 0
// // 1
// // 2
// // let内层结束
// // -------------------------------------------------------------------------
// for (var i = 0; i < 3; i++) {
//   for (var i = 0; i < 3; i++) {
//     console.log(i)
//   }
//   console.log('var内层结束')
// }

// // 0
// // 1
// // 2
// // var内层结束
// // -------------------------------------------------------------------------
// // 模拟web环境 每个{}代表一个元素
// var elements = [{}, {}, {}]
// // 模拟为每个元素添加onclick方法
// for (var i = 0; i < elements.length; i++) {
//   elements[i].onclick = function () {
//     console.log(i)
//   }
// }
// // 使用var的话无论打印哪个click都是3!!!! 因为i已经累加到3了
// elements[2].onclick()

// // 闭包实现起来还是比较复杂的需要用立即执行函数返回一打印的函数, 否则没办法调用
// // 而且还要传参i后面括号和外层的函数都需要传参
// var elements = [{}, {}, {}]
// for (var i = 0; i < elements.length; i++) {
//   elements[i].onclick = (function (i) {
//     return function () {
//       console.log(i)
//     }
//   })(i)
// }
// // 闭包采用函数作用域摆脱全局作用域的影响
// elements[2].onclick()

// var elements = [{}, {}, {}]
// for (let i = 0; i < elements.length; i++) {
//   elements[i].onclick = function () {
//     console.log(i)
//   }
// }
// // let直接块级作用域一步到位
// elements[2].onclick()
// // -------------------------------------------------------------------------
// for (let i = 0; i < 3; i++) {
//   let i = 'foo'
//   console.log(i)
// }
// // foo
// // foo
// // foo
// // 输出三次foo表明两个i是互不影响的~
// let i = 0
// if (i < 3) {
//   let i = 'foo'
//   console.log(i)
// }

// i++
// if (i < 3) {
//   let i = 'foo'
//   console.log(i)
// }
// i++
// if (i < 3) {
//   let i = 'foo'
//   console.log(i)
// }
// // 循环体中的i是内层独立的作用域, 外层是for循环本身的作用域
// // -------------------------------------------------------------------------
// // 声明提升
// console.log(foo)
// var foo = 'mm'
// // 打印的undefined, 因为变量提升, 预编译~
// console.log(foo)
// let foo = 'mm'
// // ReferenceError: Cannot access 'foo' before initialization
